'''
推导式：是一种简洁高效的语法结构，快速生成列表，字典和集合等数据结构
包括四类：列表推导式，字典推导式 集合推导式 生成器
没有元组推导式和字符串推导式,因为元组和字符串不可变

列表推导式  [表达式 for 变量 in 序列集 if 条件]
集合推导式  {表达式 for 变量 in 序列集 if 条件}
字典推导式  {键的表达式:值表达式 for 变量 in 序列集 if 条件}
生成器 生成一些数据序列 (表达式 for 变量 in 序列集 if 条件)
'''
# 1~10之间所有数字的平方，放到一个列表中。
# 方法1：
a = []
for i in range(1,11):
    a.append(i**2)
print(a)

# 方法2
b = lambda x:x**2
c = list(map(b,range(1,11)))
print(c)

# 方法2 列表推导式 [表达式 for 变量 in 序列集 if 条件]
d = [x**2 for x in range(1,11)]
print(d)

# 获取1-20以内的所有偶数，存储到列表中
e = [ i for i in range(1,21) if i%2==0]
print(e)

# 1-20以内的数,如果元素是偶数，在列表中存偶数，如果元素是奇数，存奇数
f = ["偶数" if y%2==0 else "奇数" for y in range(1,21) ]
print(f)

# 笛卡尔集
h = "121"
q = "abc"
w = "#$%"
# d = []
# for i in h:
#     for j in q:
#         for k in w:
#             d.append(i+j+k)
# print(d)
d = [i+j+k for i in h for j in q for k in w]
print(d)

# 1~10之间所有数字的平方，放到一个集合中。
set1 = {x**2 for x in range(1,11)}
print(set1)
# 1-20以内的数,如果元素是偶数，在集合中存偶数，如果元素是奇数，存奇数
set2 = {"偶数" if y%2==0 else "奇数" for y in range(1,21)}
print(set2)

set3= {i+j+k for i in h for j in q for k in w}
print(set3)

#字典推导式
students= {"tom":34,"lucy":78,"lily":67,"jerry":56}
# 将成绩及格的保留下来，存储到新字典中
students1 = { k:v+4 for k,v in students.items() if (v+4)>=60 }
print(students1)

# 生成器 generator
s = (x**2 for x in range(1,11))
print(type(s))
# for aa in s:
#     print(aa)
print(tuple(s))




